package com.java.advance.custom.mybatis.utils;

import com.java.advance.custom.mybatis.pojo.User;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 反射工具类
 * Created by aivin on 2019/3/12.
 */
public class ReflectionUtil {


    /**
     * 为指定的bean的propName属性的值设置value
     *
     * @param entity
     * @param resultSet
     */
    public static void setPropertyToBeanFromResultSet(Object entity, ResultSet resultSet) throws SQLException {
        //通过反射获取对象的所有字段
        Field[] fields = entity.getClass().getDeclaredFields();
        //遍历所有的字段，从ResultSet中读取相应的数据，并填充中对象的属性中
        for (int i = 0; i < fields.length; i++) {
            if (fields[i].getType().getSimpleName().equals("string")) {
                //如果是字符串类型
                setPropToBean(entity, fields[i].getName(), resultSet.getString(fields[i].getName()));
            } else if (fields[i].getType().getSimpleName().equals("Integer")) {
                //如果是int类型的数据
                setPropToBean(entity, fields[i].getName(), resultSet.getInt(fields[i].getName()));
            } else if (fields[i].getType().getSimpleName().equals("Long")) {
                //如果是long类型的数据
                setPropToBean(entity, fields[i].getName(), resultSet.getLong(fields[i].getName()));
            }
        }

    }


    public static void setPropToBean(Object bean, String propName, Object value) {
        Field f;
        try {
            f = bean.getClass().getDeclaredField(propName);
            f.setAccessible(true);//将字段设置为可通过反射进行访问
            f.set(bean, value);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        User user = new User();
        setPropToBean(user, "nickName", "绿巨人");
        System.out.println(user);
    }
}
